package cn.akwangl.tools.atomic;

import cn.akwangl.model.User;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 演示某个class类临时赋予原子特性.
 * <p>
 * 既然已经有了AtomicInteger，为什么又多此一举弄出个AtomicIntegerFieldUpdater来呢？<br/>
 * 其实主要有两方面原因：
 * <p>
 * <lo>
 * <li>要使用AtomicInteger需要修改代码，将原来int类型改造成AtomicInteger，使用该对象的地方都要进行调整（多进行一次get()操作获取值），但是有时候代码不是我们想改就能改动的。</li>
 * <li>也是比较重要的一个特性，AtomicIntegerFieldUpdater可以节省内存消耗。</li>
 * </lo>
 * <p>
 * 在使用时字段必须是基本类型(不可以是包装类型)、字段必须被定义为`volatile`、底层使用反射所以也必须为`public`.
 * <p>
 * 详细请阅读该文章:<a href="https://juejin.cn/post/6907610980428021773">聊聊AtomicIntegerFieldUpdater的使用</a>
 *
 * @author 阿坤同学
 * @date 2022-11-17 17:23
 */
public class AtomicIntegerFieldUpdaterDemo {

    public static void main(String[] args) {
        User user = new User("1", 0);
        ExecutorService executorService = Executors.newFixedThreadPool(20);
        Runnable task = () -> User.SOURCE_UPDATER.incrementAndGet(user);

        for (int i = 0; i < 20000; i++) {
            executorService.submit(task);
        }

        executorService.shutdown();
        while (!executorService.isTerminated()) {

        }
        System.out.println("原子类统计数: " + user.getSource());
    }

}
